"""
客户和销售相关模型
"""
from datetime import datetime, date
from sqlalchemy.orm import relationship
from .base import BaseModel, get_db

class Customer(BaseModel):
    """客户模型"""
    __tablename__ = 'customer'
    
    # 基本信息
    name = get_db().Column(get_db().String(200), nullable=False)  # 客户名称(必填)
    customer_number = get_db().Column(get_db().String(50), unique=True, nullable=False)  # 客户编号(自动生成)
    
    # 客户分类(必填)
    category = get_db().Column(get_db().String(50), nullable=False, default='普通客户')  # 客户分类：普通客户、VIP客户、合作伙伴、其他
    category_other = get_db().Column(get_db().String(100))  # 客户分类为"其他"时的自定义描述
    
    # 客户归属地(必填)
    location = get_db().Column(get_db().String(100), nullable=False)  # 客户归属地：山西区域、四川区域、新疆区域等
    location_other = get_db().Column(get_db().String(100))  # 客户归属地为"其他"时的自定义描述
    
    # 客户来源(必填)
    source = get_db().Column(get_db().String(50), nullable=False, default='网站')  # 客户来源：网站、推荐、展会、电话、其他
    source_other = get_db().Column(get_db().String(100))  # 客户来源为"其他"时的自定义描述
    
    # 客户地址(选填)
    address = get_db().Column(get_db().Text)  # 客户详细地址
    province_id = get_db().Column(get_db().Integer, get_db().ForeignKey('regions.id'))  # 省份ID，关联行政区域表
    city_id = get_db().Column(get_db().Integer, get_db().ForeignKey('regions.id'))  # 城市ID，关联行政区域表
    district_id = get_db().Column(get_db().Integer, get_db().ForeignKey('regions.id'))  # 区县ID，关联行政区域表
    
    # 业务信息
    manager_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'))  # 负责人ID
    
    # 转化信息
    converted_from_lead_id = get_db().Column(get_db().Integer, get_db().ForeignKey('lead.id'))  # 从哪个线索转化而来
    conversion_date = get_db().Column(get_db().DateTime)  # 转化日期
    conversion_reason = get_db().Column(get_db().Text)  # 转化原因
    
    # 关联关系
    manager = relationship('User', foreign_keys=[manager_id])
    converted_from_lead = relationship('Lead', foreign_keys=[converted_from_lead_id])
    
    # 行政区域关联 - 使用字符串引用，避免循环导入问题
    province = relationship('Region', foreign_keys=[province_id])
    city = relationship('Region', foreign_keys=[city_id])
    district = relationship('Region', foreign_keys=[district_id])
    
    # 客户关联的联系人
    contacts = relationship('Contact', backref='customer', lazy=True, cascade='all, delete-orphan')
    # 客户关联的跟进记录
    followups = relationship('FollowUp', backref='customer', lazy=True, cascade='all, delete-orphan')
    # 客户关联的操作日志
    logs = relationship('CustomerLog', backref='customer', lazy=True, cascade='all, delete-orphan')
    # 客户关联的项目
    projects = relationship('Project', foreign_keys='Project.customer_id', lazy='dynamic', overlaps="customer")
    
    @staticmethod
    def generate_customer_number():
        """生成客户编码，格式：日期-自然序号（四位），如20251116-0001"""
        from datetime import datetime
        today = datetime.now().strftime('%Y%m%d')
        
        # 查询今天已创建的客户数量
        today_prefix = today
        last_customer = Customer.query.filter(
            Customer.customer_number.like(f"{today_prefix}%")
        ).order_by(Customer.customer_number.desc()).first()
        
        if last_customer:
            # 提取序号部分并递增
            last_sequence = int(last_customer.customer_number.split('-')[-1])
            new_sequence = last_sequence + 1
        else:
            new_sequence = 1
            
        # 格式化为4位数字，前面补0
        return f"{today}-{new_sequence:04d}"

class Contact(BaseModel):
    """联系人模型"""
    __tablename__ = 'contact'
    
    # 基本信息
    name = get_db().Column(get_db().String(100), nullable=False)
    position = get_db().Column(get_db().String(100))  # 职位
    phone = get_db().Column(get_db().String(20))
    email = get_db().Column(get_db().String(100))
    customer_id = get_db().Column(get_db().Integer, get_db().ForeignKey('customer.id'), nullable=False)  # 关联客户ID
    is_primary = get_db().Column(get_db().Boolean, default=False)  # 是否为主要联系人
    
    # 个人信息
    gender = get_db().Column(get_db().String(10), default='未知')  # 性别：男、女、未知
    birthday = get_db().Column(get_db().Date)  # 生日
    remarks = get_db().Column(get_db().Text)
    
    # 关联关系
    # 联系人关联的跟进记录
    followups = relationship('FollowUp', backref='contact', lazy=True)

class FollowUp(BaseModel):
    """跟进记录模型"""
    __tablename__ = 'followups'
    
    # 关联信息
    customer_id = get_db().Column(get_db().Integer, get_db().ForeignKey('customer.id'), nullable=False)  # 关联客户ID
    contact_id = get_db().Column(get_db().Integer, get_db().ForeignKey('contact.id'))  # 关联联系人ID
    manager_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)  # 负责人ID
    project_id = get_db().Column(get_db().Integer, get_db().ForeignKey('project.id'))  # 关联项目ID
    
    # 跟进内容
    followup_time = get_db().Column(get_db().DateTime, nullable=False)  # 实际跟进时间
    method = get_db().Column(get_db().String(50), default='电话')  # 跟进方式：电话、邮件、会面等
    content = get_db().Column(get_db().Text, nullable=False)  # 跟进内容
    result = get_db().Column(get_db().Text)  # 跟进结果
    attachment = get_db().Column(get_db().String(255))  # 附件路径
    next_followup_time = get_db().Column(get_db().DateTime)  # 下次跟进时间
    
    # 解决方案配合信息
    solution_support = get_db().Column(get_db().Boolean, default=False)  # 是否需要解决方案人员配合
    solution_support_user_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'))  # 配合的解决方案人员ID
    solution_support_time = get_db().Column(get_db().DateTime)  # 配合时间
    solution_confirmed = get_db().Column(get_db().Boolean, default=False)  # 解决方案人员是否已确认配合
    
    # 提醒信息
    reminder_sent = get_db().Column(get_db().Boolean, default=False)  # 是否已发送提醒
    reminder_time = get_db().Column(get_db().DateTime)  # 提醒时间
    
    # 关联关系
    manager = relationship('User', foreign_keys=[manager_id])
    solution_support_user = relationship('User', foreign_keys=[solution_support_user_id])
    project = relationship('Project', foreign_keys=[project_id])
    
    @staticmethod
    def get_upcoming_followups(days=7):
        """获取未来指定天数内需要跟进的记录"""
        from datetime import datetime, timedelta
        now = datetime.now()
        end_date = now + timedelta(days=days)
        
        return FollowUp.query.filter(
            FollowUp.next_followup_time >= now,
            FollowUp.next_followup_time <= end_date,
            FollowUp.reminder_sent == False
        ).all()
    
    @staticmethod
    def get_overdue_followups():
        """获取已过期的跟进记录"""
        from datetime import datetime
        now = datetime.now()
        
        return FollowUp.query.filter(
            FollowUp.next_followup_time < now,
            FollowUp.reminder_sent == False
        ).all()
    
    @staticmethod
    def get_solution_support_pending():
        """获取需要解决方案配合但尚未确认的记录"""
        return FollowUp.query.filter(
            FollowUp.solution_support == True,
            FollowUp.solution_confirmed == False
        ).all()

class CustomerLog(BaseModel):
    """客户操作日志模型"""
    __tablename__ = 'customer_log'
    
    customer_id = get_db().Column(get_db().Integer, get_db().ForeignKey('customer.id'), nullable=False)  # 关联客户ID
    operation_type = get_db().Column(get_db().String(50), nullable=False)  # 操作类型：创建、更新、删除等
    operation_content = get_db().Column(get_db().Text)  # 操作内容
    operator_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)  # 操作人ID
    
    # 关联关系
    operator = relationship('User', foreign_keys=[operator_id])

class Lead(BaseModel):
    """销售线索模型"""
    __tablename__ = 'lead'
    
    # 基本信息
    name = get_db().Column(get_db().String(200), nullable=False)  # 姓名
    phone = get_db().Column(get_db().String(20), nullable=False)  # 手机号
    email = get_db().Column(get_db().String(100))  # 邮箱
    company = get_db().Column(get_db().String(200))  # 公司名称
    position = get_db().Column(get_db().String(100))  # 职位
    
    # 线索属性
    source = get_db().Column(get_db().String(50), default='网站')  # 线索来源：网站、推荐、展会等
    industry = get_db().Column(get_db().String(50), default='IT')  # 行业：IT、金融、制造等
    priority = get_db().Column(get_db().String(10), default='中')  # 优先级：高、中、低
    budget = get_db().Column(get_db().Float, default=0.0)  # 预算
    status = get_db().Column(get_db().String(50), default='新线索')  # 状态：新线索、已分配、已触达、已转客户、已关闭
    score = get_db().Column(get_db().Integer, default=0)  # 线索评分
    
    # 分配信息
    assigned_to = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'))  # 分配给的销售人员
    assigned_at = get_db().Column(get_db().DateTime)  # 分配时间
    first_contact_at = get_db().Column(get_db().DateTime)  # 首次触达时间
    
    # 转化信息
    converted_to_customer_id = get_db().Column(get_db().Integer, get_db().ForeignKey('customer.id'))  # 转化的客户ID
    converted_at = get_db().Column(get_db().DateTime)  # 转化时间
    conversion_notes = get_db().Column(get_db().Text)  # 转化备注
    conversion_reason = get_db().Column(get_db().Text)  # 转化原因
    
    # 业务信息
    estimated_amount = get_db().Column(get_db().Float)  # 预估金额
    estimated_close_date = get_db().Column(get_db().Date)  # 预估成交日期
    remarks = get_db().Column(get_db().Text)  # 备注
    
    # 创建信息
    created_by = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)  # 创建人
    
    # 关联关系
    assigned_user = relationship('User', foreign_keys=[assigned_to])
    converted_customer = relationship('Customer', foreign_keys=[converted_to_customer_id])
    creator = relationship('User', foreign_keys=[created_by])
    
    # 线索跟进记录
    followups = relationship('LeadFollowUp', backref='lead', lazy=True, cascade='all, delete-orphan')
    # 线索操作日志
    logs = relationship('LeadLog', backref='lead', lazy=True, cascade='all, delete-orphan')

class LeadFollowUp(BaseModel):
    """销售线索跟进记录模型"""
    __tablename__ = 'lead_followup'
    
    # 关联信息
    lead_id = get_db().Column(get_db().Integer, get_db().ForeignKey('lead.id'), nullable=False)  # 关联线索ID
    manager_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)  # 负责人ID
    
    # 跟进内容
    method = get_db().Column(get_db().String(50), default='电话')  # 跟进方式：电话、邮件、会面等
    content = get_db().Column(get_db().Text, nullable=False)  # 跟进内容
    result = get_db().Column(get_db().Text)  # 跟进结果
    next_followup_time = get_db().Column(get_db().DateTime)  # 下次跟进时间
    
    # 关联关系
    manager = relationship('User', foreign_keys=[manager_id])

class LeadLog(BaseModel):
    """销售线索操作日志模型"""
    __tablename__ = 'lead_log'
    
    lead_id = get_db().Column(get_db().Integer, get_db().ForeignKey('lead.id'), nullable=False)  # 关联线索ID
    operation_type = get_db().Column(get_db().String(50), nullable=False)  # 操作类型：创建、更新、删除等
    operation_content = get_db().Column(get_db().Text)  # 操作内容
    operator_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)  # 操作人ID
    
    # 关联关系
    operator = relationship('User', foreign_keys=[operator_id])